﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace CityGames
{
    public partial class FormJuegosAlta : Form
    {
        private FormContenedor contenedor;
        private ErrorProvider epNombre;
        private ErrorProvider epPrecioNuevo;
        private ErrorProvider epPrecioSegundaMano;
        private DataRow dr;
        private bool modificar;
        private bool visualizar;
        private string nombreSinModificar;
        private string plataformaSinModificar;

        private string regExPrecio = @"^([0-9]+([,][0-9]{1,2})?)?$";

        public FormJuegosAlta()
        {
            InitializeComponent();
        }

        private void FormJuegosAlta_Load(object sender, EventArgs e)
        {
            try
            {
                contenedor = (FormContenedor)MdiParent;

                modificar = false;
                visualizar = false;

                nombreSinModificar = "";
                plataformaSinModificar = "";

                Genero genero = new Genero();
                Plataforma plataforma = new Plataforma();
                Tarifa tarifa = new Tarifa();

                epNombre = new ErrorProvider();
                epNombre.SetIconAlignment(tbNombre, ErrorIconAlignment.MiddleRight);
                epNombre.SetIconPadding(tbNombre, 2);
                epNombre.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epPrecioNuevo = new ErrorProvider();
                epPrecioNuevo.SetIconAlignment(tbPrecioNuevo, ErrorIconAlignment.MiddleRight);
                epPrecioNuevo.SetIconPadding(tbPrecioNuevo, 18);
                epPrecioNuevo.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                epPrecioSegundaMano = new ErrorProvider();
                epPrecioSegundaMano.SetIconAlignment(tbPrecioSegundaMano, ErrorIconAlignment.MiddleRight);
                epPrecioSegundaMano.SetIconPadding(tbPrecioSegundaMano, 18);
                epPrecioSegundaMano.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                cbGenero.DataSource = genero.ObtenerGeneros();
                cbGenero.DisplayMember = "Genero";
                cbPlataforma.DataSource = plataforma.ObtenerPlataformas();
                cbPlataforma.DisplayMember = "Nombre";
                cbTarifa.DataSource = tarifa.ObtenerTarifas();

                DataTable asd = new DataTable();

                cbTarifa.DisplayMember = "Categoria";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private bool ValidarCampos()
        {
            Juego juego = new Juego();

            string errores = "";
            bool resultado = true;
            
            try
            {
                if (tbNombre.Text == "")
                {
                    resultado = false;
                    errores += "- Debes de introducir un nombre\n";

                    epNombre.SetError(tbNombre, "Debe introducir un nombre.");
                    tbNombre.Focus();
                    tbNombre.SelectAll();
                }
                else
                {
                    if (!modificar || (modificar && (tbNombre.Text != nombreSinModificar || cbPlataforma.Text != plataformaSinModificar)))
                    {
                        if (juego.ExisteJuego(tbNombre.Text, cbPlataforma.Text))
                        {
                            resultado = false;
                            errores += "- El juego ya existe\n";

                            epNombre.SetError(tbNombre, "El juego " + tbNombre.Text + " - " + cbPlataforma.Text + " ya existe.");
                            tbNombre.Focus();
                            tbNombre.SelectAll();
                        }
                        else
                        {
                            epNombre.SetError(tbNombre, null);
                        }
                    }
                    else
                    {
                        epNombre.SetError(tbNombre, null);
                    }
                }

                if (!Regex.Match(tbPrecioNuevo.Text, regExPrecio).Success)
                {
                    resultado = false;
                    errores += "- El precio Nuevo es incorrecto\n";

                    epPrecioNuevo.SetError(tbPrecioNuevo, "El precio debe tener formato 12,75");
                    tbPrecioNuevo.Focus();
                    tbPrecioNuevo.SelectAll();
                }
                else
                {
                    epPrecioNuevo.SetError(tbPrecioNuevo, null);

                }

                if (!Regex.Match(tbPrecioSegundaMano.Text, regExPrecio).Success)
                {
                    resultado = false;
                    errores += "- El precio de Segunda Mano es incorrecto\n";

                    epPrecioSegundaMano.SetError(tbPrecioSegundaMano, "El precio debe tener formato 12,75");
                    tbPrecioSegundaMano.Focus();
                    tbPrecioSegundaMano.SelectAll();
                }
                else
                {
                    epPrecioSegundaMano.SetError(tbPrecioSegundaMano, null);
                }
                
                if (!resultado)
                {
                    MessageBox.Show(errores, "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    if (epNombre.GetError(tbNombre) != "")
                        tbNombre.Focus();
                    else if (epPrecioNuevo.GetError(tbPrecioNuevo) != "")
                        tbPrecioNuevo.Focus();
                    else if (epPrecioSegundaMano.GetError(tbPrecioSegundaMano) != "")
                        tbPrecioSegundaMano.Focus();
                }
                
            }
            catch (Exception ex)
            {
                resultado = false;
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        private void bExaminar_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog buscador = new OpenFileDialog();
                buscador.Multiselect = false;
                buscador.Filter = "Imagenes (*.jpeg; *.jpg; *.png; *.gif)|*.jpeg; *.jpg; *.png; *.gif";


                if (buscador.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    tbCaratula.Text = buscador.FileName.ToString();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbCaratula_MouseClick(object sender, MouseEventArgs e)
        {
            try
            {
                bExaminar_Click(sender, e);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbCaratula_TextChanged(object sender, EventArgs e)
        {
            try
            {
                pbCaratula.ImageLocation = tbCaratula.Text;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                Juego nuevoJuego = new Juego();

                if (ValidarCampos())
                {
                    if (!modificar)
                    {
                        nuevoJuego.Nombre = tbNombre.Text;
                        nuevoJuego.Plataforma = cbPlataforma.Text;
                        nuevoJuego.Genero = cbGenero.Text;
                        nuevoJuego.Sinopsis = tbSinopsis.Text;
                        nuevoJuego.Caratula = tbCaratula.Text;
                        nuevoJuego.PrecioNuevo = tbPrecioNuevo.Text;
                        nuevoJuego.PrecioSegundaMano = tbPrecioSegundaMano.Text;
                        nuevoJuego.Tarifa = cbTarifa.Text;
                        nuevoJuego.FechaLanzamiento = dtpFechaLanzamiento.Value;

                        if (nuevoJuego.InsertarJuego())
                        {
                            MessageBox.Show("Juego insertado correctamente.", "Correcto", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            MessageBox.Show("Ha ocurrido un error en la inserción.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        dr["Nombre"] = tbNombre.Text;
                        dr["Plataforma"] = cbPlataforma.Text;
                        dr["Genero"] = cbGenero.Text;
                        dr["Sinopsis"] = tbSinopsis.Text;
                        dr["Caratula"] = tbCaratula.Text;
                        if (tbPrecioNuevo.Text != "")
                            dr["P.Nuevo"] = decimal.Parse(tbPrecioNuevo.Text);
                        else
                            dr["P.Nuevo"] = DBNull.Value;
                        if (tbPrecioSegundaMano.Text != "")
                            dr["P.2ª Mano"] = decimal.Parse(tbPrecioSegundaMano.Text);
                        else
                            dr["P.2ª Mano"] = DBNull.Value;
                        dr["Tarifa"] = cbTarifa.Text;
                        dr["F.Lanzamiento"] = dtpFechaLanzamiento.Value;

                        MessageBox.Show("Juego modificado correctamente.", "Correcto", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        nombreSinModificar = "";
                        plataformaSinModificar = "";
                        modificar = false;

                        contenedor.hijoFormJuegosGestion.ModificarDatos(dr);
                        if (contenedor.hijoFormJuegosGestion.ActualizarJuegos())
                            contenedor.hijoFormJuegosGestion.Focus();
                        else
                            MessageBox.Show("No se han podido actualizar los datos del juego.    ", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bLimpiar_Click(object sender, EventArgs e)
        {
            try
            {
                if (modificar)
                {
                    RecibirDatos(dr);
                }
                else
                {
                    Limpiar();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                if (visualizar)
                {
                    visualizar = false;
                    contenedor.hijoFormJuegosGestion.Focus();
                }
                else if (modificar)
                {
                    modificar = false;
                    contenedor.hijoFormJuegosGestion.Focus();
                }
                else
                {
                    contenedor.hijoFormMenuPrincipal.Focus();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void Limpiar()
        {
            try
            {
                tbNombre.Text = "";
                cbGenero.SelectedItem = cbGenero.Items[0];
                cbPlataforma.SelectedItem = cbPlataforma.Items[0];
                cbTarifa.SelectedItem = cbTarifa.Items[0];
                tbSinopsis.Text = "";
                tbCaratula.Text = "";
                tbPrecioNuevo.Text = "";
                tbPrecioSegundaMano.Text = "";
                dtpFechaLanzamiento.Value = DateTime.Now;

                epNombre.SetError(tbNombre, null);
                epPrecioNuevo.SetError(tbPrecioNuevo, null);
                epPrecioSegundaMano.SetError(tbPrecioSegundaMano, null);

                tbNombre.Focus();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void RecibirDatos(DataRow datos)
        {
            try
            {
                dr = datos;

                tbNombre.Text = datos["Nombre"].ToString();
                cbPlataforma.Text = datos["Plataforma"].ToString();
                cbGenero.Text = datos["Genero"].ToString();
                tbSinopsis.Text = datos["Sinopsis"].ToString();
                tbCaratula.Text = datos["Caratula"].ToString();
                tbPrecioNuevo.Text = datos["P.Nuevo"].ToString();
                tbPrecioSegundaMano.Text = datos["P.2ª Mano"].ToString();
                cbTarifa.Text = datos["Tarifa"].ToString();
                dtpFechaLanzamiento.Value = DateTime.Parse(datos["F.Lanzamiento"].ToString());

                epNombre.SetError(tbNombre, null);
                epPrecioNuevo.SetError(tbPrecioNuevo, null);
                epPrecioSegundaMano.SetError(tbPrecioSegundaMano, null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void ModificarDatos(DataRow datos)
        {
            try
            {
                RecibirDatos(datos);
                modificar = true;
                visualizar = false;
                nombreSinModificar = datos["Nombre"].ToString();
                plataformaSinModificar = datos["Plataforma"].ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void VisualizarDatos(DataRow datos)
        {
            try
            {
                RecibirDatos(datos);
                modificar = false;
                visualizar = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FormJuegosAlta_Activated(object sender, EventArgs e)
        {
            try
            {
                bLimpiar.Text = "Limpiar";

                tbNombre.Enabled = !visualizar;
                cbPlataforma.Enabled = !visualizar;
                cbGenero.Enabled = !visualizar;
                tbSinopsis.Enabled = !visualizar;
                tbCaratula.Enabled = !visualizar;
                bExaminar.Enabled = !visualizar;
                tbPrecioNuevo.Enabled = !visualizar;
                tbPrecioSegundaMano.Enabled = !visualizar;
                cbTarifa.Enabled = !visualizar;
                dtpFechaLanzamiento.Enabled = !visualizar;
                bGuardar.Enabled = !visualizar;
                bLimpiar.Enabled = !visualizar;

                epNombre.SetError(tbNombre, null);
                epPrecioNuevo.SetError(tbPrecioNuevo, null);
                epPrecioSegundaMano.SetError(tbPrecioNuevo, null);

                if (visualizar)
                {
                    lblTitulo.Text = "Vizualizar Juego";
                }
                else if (modificar)
                {
                    lblTitulo.Text = "Editar Juego";
                    bLimpiar.Text = "Restablecer";
                }
                else
                {
                    lblTitulo.Text = "Nuevo Juego";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void NuevoJuego(object sender, EventArgs e)
        {
            try
            {
                modificar = false;
                visualizar = false;
                Limpiar();
                FormJuegosAlta_Activated(sender, e);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
